package com.lap.framework.dto.page;

import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import java.util.function.Function;
import lombok.Getter;
import lombok.ToString;

/**
 * 分页返回结果,创建方式参考 {@link PageResponse#ok(Long)}
 *
 * @author Shuisheng Lao(劳水生)
 * @version 1.0.0
 */
@ToString
@Getter
@Schema(description = "分页结果信息")
public class PageResponse<T> {

  @Schema(description = "数据对象")
  private final List<T> rows;

  @Schema(description = "总记录数")
  private final Long totalItem;

  private PageResponse(Long totalItem) {
    this(null, totalItem);
  }

  private PageResponse(List<T> data, Long totalItem) {
    this.rows = data;
    this.totalItem = totalItem;
  }

  public <R> PageResponse<R> map(Function<T, R> convert) {
    List<R> dataList = rows.stream().map(convert).toList();
    return new PageResponse<>(dataList, totalItem);
  }

  /**
   * 创建一个分页传输对象
   *
   * @param totalItem 总记录
   * @param <R> 对象类型
   * @return 分页传输对象
   */
  public static <R> PageResponse<R> ok(Long totalItem) {
    return new PageResponse<>(totalItem);
  }

  /**
   * 创建一个分页返回传输对象
   *
   * @param data 分页数据
   * @param totalItem 总记录
   * @param <R> 对象类型
   * @return 分页传输对象
   */
  public static <R> PageResponse<R> ok(List<R> data, Long totalItem) {
    return new PageResponse<>(data, totalItem);
  }
}
